﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Atentis.Connection;
using System.Data;
using System.Threading;

namespace BorisTheBlade
{
	/// <summary>
	/// Класс - оболочка для atentis.connection
	/// </summary>
	class AtentisWrapper : IWrapper
	{

		List<IConnection> m_Connections;
		/// <summary>
		/// Подключения обертки
		/// </summary>
		public List<IConnection> Connections
		{
			get { return m_Connections; }
		}

		/// <summary>
		/// Конструктор обертки
		/// </summary>
		public AtentisWrapper()
		{
			m_Connections = new List<IConnection>();
		}

		/// <summary>
		/// Добавление нового подключения
		/// </summary>
		/// <param name="connectionID">Идентификатор подключения</param>
		/// <param name="server">Сервер</param>
		/// <param name="login">Логин</param>
		/// <param name="password">Пароль</param>
		/// <param name="port">Порт (по умолчанию 7800)</param>
		/// <returns>Возвращает подключение</returns>
		public IConnection AddConnection(string connectionID, string server, string login, string password, int port = 7800)
		{
			AtentisConnection dataAndTransSlots = new AtentisConnection(connectionID, server, login, password, port);
            dataAndTransSlots.Connected += new EventHandler(dataAndTransSlots_Connected);
			m_Connections.Add(dataAndTransSlots);

			return dataAndTransSlots;
		}

        /// <summary>
        /// Событие - слоты синхронизированы
        /// </summary>
        public event EventHandler Synchronized;

        void OnSynchronized(EventArgs e)
        {
            EventHandler handler = Synchronized;
            if (handler != null)
                handler(this, e);
        }

        void dataAndTransSlots_Connected(object sender, EventArgs e)
        {
            OnSynchronized(e);
        }

		/// <summary>
		/// Удаление существующего подключения
		/// </summary>
		/// <param name="connection">Подключение, которое нужно удалить</param>
		/// <returns>Число - результат удаления. 0 - если все хорошо</returns>
		public int DelConnection(IConnection connection)
		{
			try
			{
				connection.Disconnect();
				m_Connections.Remove(connection);
				return 0;
			}
			catch (Exception ex)
			{
				throw new Exception("Ошибка" + ex.Message + " . При удалении подключения:" + connection.ConnectionID);
			}
		}

		/// <summary>
		/// Перезапуск подключения
		/// </summary>
		/// <param name="connection">Подключение, которое нужно перезапустить</param>
		/// <returns>Число - результат удаления. 0 - если все хорошо</returns>
		public int ReloadConnection(IConnection connection)
		{
			int res = DelConnection(connection);
			connection = new AtentisConnection(connection.ConnectionID, connection.Server, connection.Login, connection.Password, int.Parse(connection.Port));
			return res;
		}
	}
}
